"""
原始直方图均衡化关注全局，会引入噪声，也会造成部分过度增强（曝光）
对比度受限的直方图均衡化算法：
1. 划分 8x8 网格，也就是将整个图像划分成64个小格子
2. 每个小格子都计算直方图信息，进行均衡化 H
3. 为避免部分过度增强，设置阈值 T，超过该阈值的像素会被裁剪并均匀分布到其他分箱中
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = cv2.imread("../images/zhifangtu.png", cv2.IMREAD_GRAYSCALE)
plt.hist(
    img.flatten(),
    bins=256,
    range=(0,256),
    density=True
)
plt.show()

# 进行对比度受限的自适应直方图均衡化
CLAHE = cv2.createCLAHE(clipLimit=40, tileGridSize=(8, 8))
img_clahe = CLAHE.apply(img)

plt.hist(
    img_clahe.flatten(),
    bins=256,
    range=(0,256),
    density=True
)
plt.show()

img_stack = np.hstack([img, img_clahe])
cv2.imshow("img_stack", img_stack)
cv2.waitKey(0)